7.Shading 1(Shading,pipeline,texture mapping)(着色,管线,纹理映射)
7.Shading 1(Shading,pipeline,texture mapping)(着色,管线,纹理映射)
specular highlight in blinn-phong model(布林冯中的高光)
高光相:由于镜面反射光的方向和观测方向接近
半程向量h=取l和v的角平分线,再做归一化
此处h和n(半程向量和法线)接近相当于v和r(观测方向和反射光)接近
真实情况依然要考虑表面的吸收率,我们在此处省略
用h和n的情况比较多,因为更好计算(其实我也不知道为什么更好算)
为什么要有指数p?
因为单单一个余弦图像的容忍度很大,用它生成的高光也很大
在Blinn-Phong model中p一般采用100到200
展示出来就是这样哒
ks表示了其亮度,p越大高光越小
ambient lighting in Blinn-Phong model(布林冯中的环境光)
环境光不讲究光从哪进来,同时从哪看也没有关系,和法线也没有关系
所以近似认为环境光是一个常数(以上都是大胆的假设,因为深究特别难)
总结一下Blinn-Phong model就是这样啦
布林冯是经验模型,并不基于真实物理光照哦
Shading Frequencies(着色频率)
统一模型着色频率不相同会导致什么?
逐三角形着色:三角形表面就是一个平面,把三角形的法线求出(对边做一个叉积)
这种也叫Flat Shading
逐顶点着色:每个顶点做一次着色(先不管顶点的法线怎么求),三个顶点组成三角形,其内部的颜色用插值获取
这种也叫Gouraud Shading
逐像素着色:对前文提到的三角形内的每个像素都插值出独特的法线方向,对每个像素进行一次着色,得到相对比较好的结果
这种也叫Phong Shading(这和前面那个布林冯不一样!虽然都是冯发明的,但这个是着色频率)
哪一种更好呢?并无绝对
几何足够复杂时,使用相对简单的着色模型也能得到不错的结果
(不是很能理解的话具体看图,每一行都是同一种几何形体使用不同的着色模型,我们发现第三种几何形体已经很复杂了,但使用三种方法都相差无几,但使用冯着色模型会造成更大开销)
历史遗留问题:我如何获得逐顶点和逐像素的法线
逐顶点如下:
求一个顶点的法线,取和他关联的平面的法线的平均值(好办法)
逐像素如下:
求得顶点的法线后,用重心坐标求出其中的法线过渡(记得归一化哦)
Graphics(Real-time Rendering)Pipeline(图形管线/实时渲染管线)
给我着色模型!给我三维模型!给我光照条件!就能得到渲染结果!
管线:从一个真实场景到演示一份图像,中间发生了什么?
- 输入空间中的点
- 将三维空间中的点投影到屏幕上
- 这些点形成三角形
- 光栅化(将三角形画在屏幕上)
- 三角形离散成各个像素
- 对每个像素进行着色
- 输出图像
现代GPU允许我们自己编程控制像素和顶点如何进行着色,这个过程我们称为shader
shader是每个顶点或每个像素通用的执行方法,只需要管每个顶点每个像素如何运作,而不是写循环。
如果我们写的是顶点的操作,则这个shader被称为vertex shader(顶点着色器)
如果我们写的是像素的操作,则这个shader被称为fragment/pixel shader(片段/像素着色器)
此处使用的GLSL是OpenGL的着色语言,图片中是像素着色器的一个小程序
接下来闫老师讲了一堆巴拉巴拉的不好总结
硬要总结一下的话就是“非常简单”(圈起来要考的)
讲了一堆硬件相关所以这里就先略过了
texture mapping(纹理映射)
引入纹理映射的基本思路:希望在物体不同位置定义不同的属性(漫反射系数或其他)
先做一个声明:任何三维物体的表面都是二维的
所以texture(纹理)是什么:texture就是一张(image)图
将这张图蒙在物体上(图上的点和物体上的点一一对应),这个过程就叫纹理映射
(闫老师能不能用点阳间的图,san值狂掉)
怎么把空间中的三角形映射到平面上?
- 需要艺术家(美工)做出一个模型,然后展开贴在物体上,对美工来说这是一个繁重的过程
- 给一个模型,我们将其展开为一个平面,希望三角形尽量少扭曲,这个过程很难,会是以后重要的研究方向(参数化)
我们在纹理上定义一个坐标系(u,v)(uv的范围都在0到1)
这样就可以把任意物体的三角形映射到纹理上显示出来
接下来我们想知道:
如果知道三角形对应顶点的uv,那么如何知道三角形内部对应每个点的uv
下节课会着重介绍插值(通过三角形的三个顶点属性,在三角形内部做一个平滑的过渡)
本文于4.20 17:25完成,终于明白什么是管线啦!(豁然开朗好开心)